/**
 *自然顺序栈：使用 nature 栈来模拟从 n 到1_ 的入栈顺序。
暂存栈：使用 temp 栈来暂存需要出栈的元素。
栈操作：通过 P 和 Q 表示入栈和出栈操作。
错误处理：当遇到无法按序出栈的情况时，输出“error”并退出。
 */


#include <iostream>
#include <stack>
using namespace std;

// 模拟栈操作的函数
void simulation(int n, int a[]) {
    stack<int> nature; // 用于模拟自然顺序的栈
    stack<int> temp;   // 用于暂存出栈元素的栈

    // 初始化自然顺序栈，按降序填充
    for (int i = 0; i < n; i++) {
        nature.push(n - i);  // 从 n 到 1 压入栈中
    }

    int i = 0; // 用于遍历输入序列 a[]

    // 开始模拟栈操作
    while (i < n) {
        // 当 temp 栈为空或 temp 栈顶元素小于 a[i] 时，继续将自然顺序栈的元素压入 temp 栈
        while (temp.empty() || temp.top() < a[i]) {
            // 如果自然顺序栈已空，跳出循环
            if (nature.empty()) break;
            temp.push(nature.top()); // 将自然顺序栈顶元素压入 temp 栈
            nature.pop();             // 从自然顺序栈中弹出该元素
            cout << "P";              // 输出入栈操作
        }

        // 检查 temp 栈顶元素是否等于当前需要的元素 a[i]
        if (!temp.empty() && temp.top() == a[i]) {
            i++;                    // 移动到下一个目标元素
            cout << "Q";           // 输出出栈操作
            temp.pop();            // 从 temp 栈中弹出该元素
        }
        // 如果 temp 栈顶元素大于 a[i]，表示无法按序出栈
        else if (!temp.empty() && temp.top() > a[i]) {
            cout << " error";      // 输出错误信息
            return;               // 退出函数
        }
    }
}

int main() {
    int n; // 输入的元素数量
    while (cin >> n) { // 读取元素数量
        int a[1000]; // 输入序列数组
        for (int i = 0; i < n; i++) {
            cin >> a[i]; // 读取输入序列
        }
        simulation(n, a); // 调用模拟函数
        cout << endl; // 输出换行以分隔不同测试用例
    }
    return 0; // 程序结束
}

